# 先引入后面可能用到的包（package）
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import akshare as ak
import talib as ta

"""人气指标（AR）和意愿指标（BR）
AR指标是通过比较某个周期内开盘价与最高、最低价，来反映市场买卖人气。
计算公式为：N日AR=(N日内（H－O）之和）/(N日内（O－L）之和)*100。
BR指标是通过比较一段周期内收盘价在该周期价格波动中的地位，来反映市场买卖意愿程度。
计算公式为：N日BR=（N日内（H－YC）之和）/N日内（YC－L）之和）*100。
其中，O 为当日开盘价，H 为当日最高价，L 为当日最低价，YC 为前一交易日的收盘价，N 为设定的时间参数，一般原始参数日设定为 26 日，计算周期可以根据自己的经验或回测结果进行修正。
 
双方的分界线是 100，100 以上是多方优势，100 以下是空方优势。
买入信号：
BR通常运行在AR上方，一旦BR跌破AR并在AR之下运行时，表明市场开始筑底，视为买进信号；
BR<40,AR<60: 空方力量较强，但随时可能反转上涨，考虑买进。
 
卖出信号：
BR>400,AR>180，多方力量极强，但随时可能反转下跌，考虑卖出；
BR快速上升，AR并未上升而是小幅下降或横盘，视为卖出信号。
 
背离信号：
AR、BR指标的曲线走势与股价K线图上的走势正好相反。
 
顶背离：
当股价K线图上的股票走势一峰比一峰高，股价一直向上涨，而AR、BR指标图上的走势却一峰比一峰低，说明出现顶背离，股价短期内将高位反转，是比较强烈的卖出信号。
 
底背离：
当股价K线图上的股票走势一底比一底低，股价一直向下跌，而AR、BR指标图上的走势却一底比一底高，说明出现底背离，股价短期内将低位反转，是比较强烈的买入信号。
"""

# 正常显示画图时出现的中文和负号
from pylab import mpl

mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False

# 引入TA-Lib库
import talib as ta
from datetime import datetime, timedelta

index2 = {
    "上证综指": "000001",
    "深证成指": "399001",
    "沪深300": "000300",
    "创业板指": "399006",
    "上证50": "000016",
    "中证500": "000905",
    "中小板指": "399005",
    "上证180": "000010",
}
index = {"上证综指": "000001"}
n = 250
tineperiod = 26
for code in index.values():
    t = datetime.now()
    t0 = t - timedelta(n)
    start = t0.strftime("%Y%m%d")
    end = t.strftime("%Y%m%d")
    index_zh_a_hist_df = ak.index_zh_a_hist(
        symbol=code, period="daily", start_date=start, end_date=end
    )
    # print(index_zh_a_hist_df)
    index_zh_a_hist_df.index = pd.to_datetime(index_zh_a_hist_df["日期"])
    df = index_zh_a_hist_df.sort_index()
    df["HO"] = df["最高"] - df["开盘"]
    df["OL"] = df["开盘"] - df["最低"]
    df["HCY"] = df["最高"] - df["收盘"].shift(1)
    df["CYL"] = df["收盘"].shift(1) - df["最低"]
    # 计算AR、BR指标
    df["AR"] = (
        ta.SUM(df.HO, timeperiod=tineperiod)
        / ta.SUM(df.OL, timeperiod=tineperiod)
        * 100
    )
    df["BR"] = (
        ta.SUM(df.HCY, timeperiod=tineperiod)
        / ta.SUM(df.CYL, timeperiod=tineperiod)
        * 100
    )
    # print(df['AR'].values[tineperiod-1:])
    # print(df['BR'].values[tineperiod-1:])
    for i in df["AR"].values[tineperiod - 1 :]:
        for j in df["BR"].values[tineperiod - 1 :]:
            if i <= 100 and j <= 100:
                print("空方优势")
                if 60 > i and i > j and j < 40:
                    print("随时可能反转上涨，考虑买进")
            elif i >= 100 and j >= 100:
                print("多方优势")
                if 180 < i and i < j and j > 400:
                    print("可能反转下跌，考虑卖出")
    result = df[["收盘", "AR", "BR"]].dropna()
    result["收盘"].plot(color="g", figsize=(14, 5))
    plt.xlabel("")
    plt.title(code + "价格走势", fontsize=15)
    df[["AR", "BR"]].plot(figsize=(14, 5))
    plt.xlabel("")
    plt.show()
